from PIL import Image
import os
import argparse


def crop_center(input_path, output_path=None, crop_width=0, crop_height=0):
    """
    从图片中心裁剪指定宽度和高度的区域

    参数:
        input_path: 输入图片路径
        output_path: 输出图片保存路径，如果为None，则自动生成
        crop_width: 裁剪后的宽度
        crop_height: 裁剪后的高度

    返回:
        成功时返回输出路径，失败时返回None
    """
    try:
        # 打开图片
        with Image.open(input_path) as img:
            # 获取原图尺寸
            width, height = img.size
            print(f"原图尺寸: {width} x {height}")

            # 如果未指定裁剪尺寸，则使用原图尺寸
            if crop_width <= 0:
                crop_width = width
            if crop_height <= 0:
                crop_height = height

            # 计算裁剪区域的坐标
            left = (width - crop_width) // 2
            top = (height - crop_height) // 2
            right = left + crop_width
            bottom = top + crop_height

            # 确保裁剪区域不超出图片范围
            if left < 0 or top < 0 or right > width or bottom > height:
                print("警告: 裁剪尺寸大于原图，将使用可能的最大裁剪区域")
                left = max(0, left)
                top = max(0, top)
                right = min(width, right)
                bottom = min(height, bottom)

            # 裁剪图片
            cropped_img = img.crop((left, top, right, bottom))

            # 显示裁剪后尺寸
            actual_width, actual_height = cropped_img.size
            print(f"裁剪后尺寸: {actual_width} x {actual_height}")

            # 如果未指定输出路径，则根据输入路径生成
            if not output_path:
                file_dir = os.path.dirname(input_path)
                file_name = os.path.basename(input_path)
                file_base, file_ext = os.path.splitext(file_name)

                # 生成新的文件名：原文件名_宽度x高度.扩展名
                new_file_name = f"{file_base}_{actual_width}x{actual_height}{file_ext}"

                # 拼接完整的输出路径
                output_path = os.path.join(file_dir, new_file_name)

            # 保存裁剪后的图片
            cropped_img.save(output_path)
            print(f"裁剪后的图片已保存至: {output_path}")

            return output_path

    except Exception as e:
        print(f"处理图片时出错: {e}")
        return None


def main():
    """命令行入口函数"""
    parser = argparse.ArgumentParser(description='从图片中心裁剪指定尺寸')
    parser.add_argument('--input', required=True, help='输入图片路径')
    parser.add_argument('--output', help='输出图片路径（可选）', default=None)
    parser.add_argument('--width', type=int, default=0, help='裁剪后的宽度（可选，默认使用原图宽度）')
    parser.add_argument('--height', type=int, default=0, help='裁剪后的高度（可选，默认使用原图高度）')

    args = parser.parse_args()

    return crop_center(args.input, args.output, args.width, args.height)


if __name__ == "__main__":
    main()